home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat01 / data / data.asm < prev    next >
Assembly Source File  |  1992-07-21  |  5KB  |  212 lines

  1.  
  2. ExecBase    =  4
  3. OldOpenLib  = -408
  4. CloseLib    = -414
  5. Output      = -60
  6. Write       = -48
  7. Open        = -30
  8. Close       = -36
  9. Read        = -42
  10.  
  11.  
  12. Main:
  13.     movem.l    D1-D7/A0-A6,-(SP)    ; Sauvegarde des registres
  14.     subq.w    #1,D0
  15.     beq    Erreur            ; Erreur : paramètres inexistants
  16. NoSpace:                ; Suppression des espaces
  17.     cmpi.b    #32,(A0)+
  18.     bne.s    Param1
  19.     dbf    D0,NoSpace
  20.     bra    Erreur            ; Erreur : paramètres insuffisants
  21. Param1:
  22.     lea    File,A1
  23.     subq.l    #1,A0
  24. Found:
  25.     move.b    (A0)+,(A1)+        ; Récupération nom du fichier source
  26.     cmpi.b    #32,(A0)
  27.     beq.s    NoSpace2
  28.     dbf    D0,Found
  29.     bra    Erreur            ; Erreur : paramètres insuffisants
  30. NoSpace2:                ; Suppression des espaces
  31.     cmpi.b    #32,(A0)+
  32.     bne.s    Param2
  33.     dbf    D0,NoSpace2
  34.     bra    Erreur            ; Erreur : paramètres insuffisants
  35. Param2:
  36.     move.b    -1(A0),Suffix        ; Récupération de l'extension
  37.     cmpi.b    #32,(A0)
  38.     beq.s    Label1
  39.     cmpi.b    #10,(A0)
  40.     bne    Erreur            ; Erreur : paramètres invalides
  41. Label1:
  42.     cmpi.b    #'w',Suffix
  43.     beq.s    Label3
  44.     cmpi.b    #'b',Suffix
  45.     bne.s    Label2
  46.     move.b    #12,Nombre        ; 12 Données par ligne
  47.     move.w    #1,NbOctets
  48.     bra.s    Label3
  49.  
  50. Label2:
  51.     cmpi.b    #'l',Suffix
  52.     bne    Erreur            ; Erreur : paramètres invalides
  53.     move.b    #5,Nombre        ; 5 Données par ligne
  54.     move.w    #4,NbOctets
  55. Label3:
  56.     move.l    ExecBase,A6
  57.     lea    DosLib,A1
  58.     moveq    #0,D0
  59.     jsr    OldOpenLib(A6)        ; Ouverture de la Dos Library
  60.     move.l    D0,DosBase
  61.     move.l    D0,A6
  62.     jsr    Output(A6)
  63.     move.l    D0,StdOut        ; Adresse de la structure de sortie
  64.     move.l    #1005,D2        ; Old Mode
  65.     move.l    #File,D1        ; Fichier à ouvrir
  66.     jsr    Open(A6)
  67.     move.l    D0,FileHandle
  68.     beq    NoFile            ; Erreur : Fichier Inexistant
  69.     move.w    NbOctets,D2        ; Calcul du compteur
  70.     add.w    D2,D2            ; de boucle de la
  71.     subq.w    #1,D2            ; conversion héxadécimale
  72.     move.w    D2,Cpt            ; (2, 4, ou 8 chiffres)
  73.     moveq    #0,D5            ; RAZ du compteur de data par ligne
  74. Lecture:
  75.     move.l    FileHandle,D1
  76.     move.l    #Data,D2        ; Adresse du tampon de lecture
  77.     moveq    #0,D3
  78.     move.w    NbOctets,D3        ; Nb d'octets à lire
  79.     jsr    Read(A6)
  80.     tst.w    D0            ; Fin de fichier ?
  81.     beq.s    LastLine        ; Oui, c'est la dernière ligne
  82.     move.b    D0,Nb            ; Nb d'octets lus
  83.     tst.b    D5            ; On entame une nouvelle ligne ?
  84.     bne.s    Suite            ; Non !
  85.     lea    Ligne2,A5
  86. Suite:
  87.     move.l    Data,D0            ; Donnée à traduire
  88.     bsr    Bin2Hex            ; Conversion Binaire -> Hexa
  89.     bra.s    Lecture            ; Donnée suivante !
  90.  
  91. LastLine:
  92.     tst.b    D5            ; La dernière ligne est elle vide ?
  93.     beq.s    Sortie            ; Oui, alors on sort
  94.     move.b    #10,(A5)+        ; Sinon on l'affiche
  95.     move.b    #0,(A5)
  96.     move.w    NbOctets,D2
  97.     subq.l    #1,A5
  98. Boucle:
  99.     cmp.b    Nb,D2            ; On complète la dernière
  100.     beq.s    DispLine        ; donnée avec des zéros
  101.     move.b    #48,-(A5)        ; s'il y a lieu :
  102.     move.b    #48,-(A5)        ; par exemple, pour afficher en
  103.     subq.b    #1,D2            ; mots longs un fichier au
  104.     bra.s    Boucle            ; nombre d'octets impair
  105.  
  106. DispLine:
  107.     lea    Ligne,A0
  108.     bsr    Affiche
  109. Sortie:    
  110.     move.l    FileHandle,D1
  111.     jsr    Close(A6)
  112. Fin:
  113.     move.l    ExecBase,A6
  114.     move.l    DosBase,A1
  115.     jsr    CloseLib(A6)
  116.     movem.l    (SP)+,D1-D7/A0-A6    ; Réinitialisation des registres
  117.     clr.l    D0            ; Annulation du drapeau d'erreur
  118.     rts                ; Retour au système
  119.  
  120. Erreur:                    ; Affichage de la syntaxe
  121.     move.l    ExecBase,A6        ; de la commande
  122.     lea    DosLib,A1
  123.     moveq    #0,D0
  124.     jsr    OldOpenLib(A6)
  125.     move.l    D0,DosBase
  126.     move.l    D0,A6
  127.     jsr    Output(A6)
  128.     move.l    D0,StdOut
  129.     lea    Syntaxe,A0
  130.     bsr    Affiche
  131.     bra.s    Fin
  132.  
  133. NoFile:                    ; Affichage du message d'erreur
  134.     lea    NotFound,A0        ; de fichier non trouvé
  135.     bsr    Affiche
  136.     bra.s    Fin
  137.  
  138. Affiche:
  139.     move.l    A0,D2
  140.     moveq    #0,D3
  141. NextCar:
  142.     addq.b    #1,D3            ; Calcul du nombre de caractères
  143.     tst.b    (A0)+            ; de la chaine à afficher
  144.     bne.s    NextCar
  145.     subq.b    #1,D3
  146.     move.l    StdOut,D1
  147.     jsr    Write(A6)        ; (file, buffer, length) (D1, D2, D3)
  148.     rts
  149.  
  150. Bin2Hex:                ; (Nombre binaire D0)
  151.     tst.b    D5            ; Est-ce la première valeur ? 
  152.     beq.s    NoComma            ; Oui, donc pas de virgule devant
  153.     move.b    #',',(A5)+
  154. NoComma:    
  155.     move.b    #'$',(A5)+
  156.     move.l    D0,D1
  157.     move.w    Cpt,D2            ; Cpt = 2, 4 ou 8 chiffres
  158. Hexa1:
  159.     rol.l    #4,D1            ; Conversion par Quartets
  160.     move.b    D1,D0
  161.     andi.b    #$F,D0
  162.     addi.b    #48,D0
  163.     cmpi.b    #58,D0            ; Est-ce un chiffre (0-9) ?
  164.     blt.s    Hexa2
  165.     addq.b    #7,D0            ; Non, c'est une lettre (A-F)
  166. Hexa2:
  167.     move.b    D0,(A5)+
  168.     dbf    D2,Hexa1
  169.     addq.b    #1,D5
  170.     cmp.b    Nombre,D5        ; La ligne n'est pas complète
  171.     bne.s    Suivant            ; donc on continue
  172.     move.b    #10,(A5)+        ; Sinon on l'affiche
  173.     move.b    #0,(A5)
  174.     lea    Ligne,A0
  175.     bsr    Affiche
  176.     moveq    #0,D5            ; RAZ du compteur de data par ligne
  177. Suivant:
  178.     rts
  179.  
  180. DosBase:
  181.     dc.l    0
  182. StdOut:
  183.     dc.l    0
  184. DosLib:
  185.     dc.b    'dos.library',0
  186.     even
  187. File:
  188.     blk.b    80,0
  189. FileHandle:
  190.     dc.l    0
  191. Data:
  192.     dc.l    0
  193. Nb:
  194.     dc.b    0
  195. Nombre:
  196.     dc.b    8
  197. NbOctets:
  198.     dc.w    2
  199. Cpt:
  200.     dc.w    0
  201. Ligne:
  202.     dc.b    '    dc.'
  203. Suffix:
  204.     dc.b    'w    '
  205. Ligne2:
  206.     blk.b    50,0
  207. Syntaxe:
  208.     dc.b    10,'  USAGE: DATA [>Dest_File] <File_Name> <b.w.l>',10,10,0
  209.     even
  210. NotFound:
  211.     dc.b    10,'  File Not Found !',10,10,0 
  212.